#include "Sql_list.h"

// 顺序表的初始化
Sql_list * Init_Sql_List(int max)
{
    if (0 >= max)
    {
        printf("创建的空间太小了\n");
        return NULL;
    }

    // 创建动态空间
    Sql_list *L = (Sql_list *)malloc(sizeof(Sql_list));
    if (NULL == L)
    {
        printf("顺序表创建动态空间失败\n");
        return NULL;
    }
    L->data = (Elenemt_data * )malloc(max * sizeof(Elenemt_data));
    if (NULL == L->data)
    {
        printf("顺序表创建动态空间失败\n");
        return NULL;
    }
    L->len = 0;
    L->max = max;

    return L;
    
}

// 顺序表的插入
int tail_insert_tail(Sql_list * L , Elenemt_data data)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return EOF;
    }
    if (NULL == L->data)
    {
        printf("顺序表 空间 为 NULL \n");
        return EOF;
    }
    if (L->max <= L->len)
    {
        printf("顺序表 为 满 \n");
        return EOF;
    }

    // 插入
    L->data[L->len] = data;
    // 迭代
    L->len++;
    
}



// 顺序表的遍历
void printf_Sql_List(Sql_list * L)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return ;
    }
    if (NULL == L->data)
    {
        printf("顺序表 为 NULL \n");
        return ;
    }
    if (0 == L->len)
    {
        printf("顺序表 内 无数据 \n");
        return ;
    }

    for (size_t i = 0; i < L->len; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
        L->data[i].name , L->data[i].sex , L->data[i].age , 
        L->data[i].sco  , L->data[i].id 
        );
    }

}


// 顺序表的扩容
Elenemt_data * Expand_Sql_List(Sql_list * L , int num)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return NULL;
    }
    if (NULL == L->data)
    {
        printf("顺序表 为 NULL \n");
        return NULL;
    }
    if (num == L->max)
    {
        printf("无操作\n");
        return NULL;
    }

    // 1 为新数据创建空间
    Elenemt_data * new_data = (Elenemt_data *)malloc(num * sizeof(Elenemt_data));

    if (num < L->max)
    {
        if (num < L->len)
        {
            char ch = 0;
            printf("新空间 不能 全部存放原来的数据 是否继续执行(Y:继续 N:不继续)");
            ch = getchar();
            if ('N' == ch)
            {
                return NULL;
            }
            L->len = num;
        }
        // 缩容
        // 2 为新数据空间 写入 数据    
        for (size_t i = 0; i < L->len && i < num ; i++)
        {
            new_data[i] = L->data[i];
        }

    }
    else
    {
        // 2 为新数据空间 写入 数据
        for (size_t i = 0; i < L->len; i++)
        {
            new_data[i] = L->data[i];
        }
    }
    

    
    // 3 释放原空间
    free(L->data);

    // 4 将 表的 data 指向 新空间
    L->data = new_data;

    // 5 修改 max 的值
    L->max = num;
    
    // 6 返回 新数据的地址
    return new_data;

}

// 顺序表的销毁
void Destroy_Sql_List(Sql_list ** L)
{
    if (NULL == *L)
    {
        printf("表为 NULL\n");
        return ;
    }
    if (NULL == (*L)->data)
    {
        printf("表为 NULL\n");
        return ;
    }
    
    // 先销毁数据
    free((*L)->data);
    (*L)->data = NULL;

    // 销毁表
    free(*L);
    *L = NULL;

}

